/***  BIBLIOTECAS  ***/
#include "Algoritmos.h"
#include "Estructuras.h"
#include "TADComunicacion.h"
#include "Ppd_funciones.h"
#include "log.h"

extern char rutaArchivoConfig[256];



void sigchld_handler(int32_t signal){
	waitpid(-1,0,WNOHANG);
	close(SockConsola);
	printf("\n\n##PPD Terminado: La consola ha terminado.\n\n");
	exit(EXIT_SUCCESS);
}


/******* Configuracion Servidor UNIX *******/
int32_t ServUnix(void){
    int32_t sockfd;
	int32_t server_len;
    struct sockaddr_un server_address;
	extern char PORT[50];
    
    unlink(PORT);
	sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

    server_address.sun_family = AF_UNIX;
    strcpy(server_address.sun_path, "server_socket");
    server_len = sizeof(server_address);
    
    bind(sockfd, (struct sockaddr*)&server_address, server_len);

    listen(sockfd, 5);
	return sockfd;
}

/******* Configuracion Socket AF_INET *******/
int32_t CListen(void){

	int32_t sock,port;
	struct sockaddr_in myaddr; // direccion del servidor
	int32_t yes=1; // para setsockopt() SO_REUSEADDR, mas abajo
	
	// obtener socket a la escucha
	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("socket");
		return -1;
	}
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int32_t)) == -1) {
		perror("setsockopt");
		return -1;
	}
	myaddr.sin_family = AF_INET;
	myaddr.sin_addr.s_addr = INADDR_ANY;

	port=obtenerPuertoTcp();

	myaddr.sin_port = htons(port);
	memset(&(myaddr.sin_zero), '\0', 8);
	if (bind(sock, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1) {
		perror("bind");
		return -1;
	}

	if (listen(sock,10) == -1) {
		perror("listen");
		return -1;
	}
	return sock;
}

int32_t FuncionConsola(int32_t Sock){
	int32_t bytesRec= -1,i=0,n=0,j=0,m,cant=0,sec1,sec2;
	char comandoConsola[10];
	int32_t secTrace[5];
	TNodoPedido *nodoPedido, *auxPedido;
	TCola *nodosTRACE;
	char sector[10],cabezal[40];
	extern TNodoPista *listaPistasEncolar;
	extern int32_t cantidadSectoresPorPista;
	extern TNodoPista *listaPistas;
	extern pistaSector infoCabActual;
	extern int32_t sectoresEnTrace;
	extern pthread_mutex_t mutex;
	extern char algoritmo[10];
	extern int32_t sectoresEnClean;
	//extern int32_t flagSalida;
	extern int32_t opcionLog;
	extern int32_t tEscritura;
	extern int32_t tLectura;
	//extern t_log* log;

	TMensaje *TheirM=(TMensaje *)malloc(sizeof(struct TMensaje));

	
	memset(TheirM->payload,'\0',1100);

	for(i=0;i<=5;i++){
		secTrace[i]=-1;
	}
	i=0;


	bytesRec=-1;
	while(bytesRec<0){
		bytesRec=recv(Sock,(void*)TheirM,sizeof(struct TMensaje),MSG_WAITALL);
	}

	if(bytesRec==0){
		free(TheirM);
		return 0;
	}
	else{
		memset(comandoConsola,'\0',10);
	
		while((TheirM->payload[i] != ' ')&&(TheirM->payload[i] != '\0')){
			comandoConsola[n]=TheirM->payload[i];
			i++;
			n++;
		}
		i++;
	
		if(!strcmp(comandoConsola,"info")){
			memset(cabezal,'\0',40);
			sprintf(cabezal,"Posicion actual del cabezal: (%d:%d) ",infoCabActual.pista,infoCabActual.sector);
			if(opcionLog==2){
				log_info(log, "PPD", "Message info: %s%s", "Pedido de la consola: ",TheirM->payload);
			}
			ComunicacionA(Sock,'X',cabezal,TheirM->idDescriptor);
		}

		if(!strcmp(comandoConsola,"clean")){

			if(opcionLog==2){
				log_info(log, "PPD", "Message info: %s%s", "Pedido de la consola: ",TheirM->payload);
			}
			sectoresEnClean=0;
			n=0;
			memset(sector,'\0',10);
			while((TheirM->payload[i] != ' ')){

				sector[n]=TheirM->payload[i];
				i++;
				n++;
			}
			i++;
			sec1=atoi(sector);
			n=0;
			memset(sector,'\0',10);
			while((TheirM->payload[i] != '\0')){

				sector[n]=TheirM->payload[i];
				i++;
				n++;
			}
			sec2=atoi(sector);
			m=sec1;
			while(sec1<=sec2){
				//Decodifico para meter en nodo
				nodoPedido=(TNodoPedido *)calloc(1, sizeof(TNodoPedido));
				nodoPedido->pista=sec1/cantidadSectoresPorPista;
				nodoPedido->sector=sec1-(nodoPedido->pista*cantidadSectoresPorPista); //para indicar el número de sector dentro de la pista
				nodoPedido->tOper='E';
				memset(nodoPedido->datos,'\0',512);
				nodoPedido->Next=NULL;
				nodoPedido->sock=Sock;
				//Meto el nodo en la lista de pistas
				if(!strcmp(algoritmo,"SSTF")){
					pthread_mutex_lock(&mutex);
					listaPistas=insertarPedidoEnPista(nodoPedido);
					pthread_mutex_unlock(&mutex);
				}
				if(!strcmp(algoritmo,"FSCAN")){
					pthread_mutex_lock(&mutex);
					listaPistasEncolar=insertarPedidoEnPista(nodoPedido);
					pthread_mutex_unlock(&mutex);
				}
				sec1++;
				sectoresEnClean++;
			}
			sem_post(&Semaforo);
		}

		if(!strcmp(comandoConsola,"trace")){

			if(opcionLog==1){
				log_info(log, "PPD", "Message info: %s%s", "Pedido de la consola: ",TheirM->payload);
			}
			n=0;
			j=0;
			while(1){
				n=0;
				memset(sector,'\0',10);
				while((TheirM->payload[i] != ' ')&&(TheirM->payload[i] != '\0')){
					sector[n]=TheirM->payload[i];
					i++;
					n++;
				}
				secTrace[j]=atoi(sector);

				if(TheirM->payload[i] == '\0'){
					break;
				}
				else{
					i++;
					j++;
				}
			}
			sectoresEnTrace=j+1;
			
			cant=0;
			nodosTRACE=CrearCola();
			while(secTrace[cant]!=-1){
				//Decodifico para meter en nodo
				nodoPedido=(TNodoPedido *)calloc(1, sizeof(TNodoPedido));
				nodoPedido->pista=secTrace[cant]/cantidadSectoresPorPista;
				nodoPedido->sector=secTrace[cant]-(nodoPedido->pista*cantidadSectoresPorPista); //para indicar el número de sector dentro de la pista
				nodoPedido->tOper='T';
				memset(nodoPedido->datos,'\0',512);
				nodoPedido->Next=NULL;
				nodoPedido->sock=Sock;
				meterCola(nodosTRACE, nodoPedido);
				cant++;
			}
			if(!strcmp(algoritmo,"SSTF")){
				pthread_mutex_lock(&mutex);
				while(nodosTRACE->Head!=NULL){//Meto el nodo en la lista de pistas
					nodoPedido=sacarElemento(nodosTRACE);
					auxPedido=nodoPedido;
					listaPistas=insertarPedidoEnPista(auxPedido);
				}
				pthread_mutex_unlock(&mutex);
				free(nodosTRACE);
			}

			if(!strcmp(algoritmo,"FSCAN")){
				pthread_mutex_lock(&mutex);
				while(nodosTRACE->Head!=NULL){//Meto el nodo en la lista de pistas
					nodoPedido=sacarElemento(nodosTRACE);
					auxPedido=nodoPedido;
					listaPistasEncolar=insertarPedidoEnPista(auxPedido);
				}
				pthread_mutex_unlock(&mutex);
				free(nodosTRACE);

			}
			sem_post(&Semaforo);
		}
		
		if((strcmp(comandoConsola,"trace"))&&(strcmp(comandoConsola,"exit"))&&(strcmp(comandoConsola,"clean"))&&(strcmp(comandoConsola,"info"))){
			ComunicacionA(Sock,'X',"El comando no es reconocido por el PPD.\n",TheirM->idDescriptor);
			return -1;
		}
		free(TheirM);
		return 1;
	}
}

int32_t EncolarPeticion(int32_t Sock){
	extern TNodoPista *listaPistas;
	int32_t bytesRec=-1,i=0,n=0,sector,m=0,flag=1;
	extern int32_t cantidadSectoresPorPista;
	extern pthread_mutex_t mutex;
	extern char algoritmo[10];
	extern TNodoPista *listaPistasEncolar;
	char sectorC[10],comando[10],datos[512];
	TNodoPedido *nodoPedido;
	TMensaje *TheirM=malloc(sizeof(struct TMensaje));
	extern int32_t opcionLog;
	extern int32_t contador;
	extern t_log* log;


	memset(datos,'\0',sizeof(datos));
	memset(comando,'\0',sizeof(comando));

	while(1){
		memset(TheirM->payload,'\0',sizeof(TheirM->payload));
		bytesRec=-1;
		while(bytesRec<0){
			bytesRec=recv(Sock,(void*)TheirM,sizeof(struct TMensaje),MSG_WAITALL);
		}
		if(bytesRec==0){
			flag=0;
			break;
		}
		if((TheirM->payload[0]=='r')||(TheirM->payload[0]=='w'))
			break;
	}

	if(flag){
		/*contador++;
		if(contador==10000){
			printf("\n-Recibi %s\n",TheirM->payload);
			contador=0;
		}*/

		while(TheirM->payload[i] != '('){

			comando[n]=TheirM->payload[i];
			i++;
			n++;
		}
		n=0;
		i++;
		memset(sectorC,'\0',10);
		while((TheirM->payload[i] != ',')&&(TheirM->payload[i] != ')')){
			sectorC[n]=TheirM->payload[i];
			i++;
			n++;
		}
		sector=atoi(sectorC);
		if(!strcmp(comando,"write")){
			i++;
			m=TheirM->payloadLength-i-1;
			n=0;
			memset(datos,'\0',sizeof(datos));
			while(n<512){
				datos[n]=TheirM->payload[i];
				i++;
				n++;
			}
		}

		//Decodifico para meter en nodo
		nodoPedido=(TNodoPedido *)calloc(1, sizeof(TNodoPedido));
		nodoPedido->pista=sector/cantidadSectoresPorPista;
		nodoPedido->sector=sector-(nodoPedido->pista*cantidadSectoresPorPista); //para indicar el número de sector dentro de la pista
		
		if(!strcmp(comando,"write")){
			nodoPedido->tOper='E';
			memcpy(nodoPedido->datos,datos,512);
			if(opcionLog==1){
				log_info(log, "PPD", "Message info: %s%ld.", "Llegada un pedido. Tipo: Escritura. Sector: ",sector);
			}
		}
		if(!strcmp(comando,"read")){
			nodoPedido->tOper='L';
			memset(nodoPedido->datos,'\0',512);
			if(opcionLog==1){
				log_info(log, "PPD", "Message info: %s%ld.", "Llegada un pedido. Tipo: Lectura. Sector: ",sector);
			}
		}
		memcpy(nodoPedido->idDescriptor, TheirM->idDescriptor,16);
		nodoPedido->sock=Sock;
		nodoPedido->Next=NULL;

		//Meto el nodo en la lista de pistas
		if(!strcmp(algoritmo,"SSTF")){
			pthread_mutex_lock(&mutex);
			listaPistas=insertarPedidoEnPista(nodoPedido);
			pthread_mutex_unlock(&mutex);
		}

		if(!strcmp(algoritmo,"FSCAN")){
			pthread_mutex_lock(&mutex);
			listaPistasEncolar=insertarPedidoEnPista(nodoPedido);
			pthread_mutex_unlock(&mutex);
		}
		sem_post(&Semaforo);

		free(TheirM);
		return 1;
	}
	else{
		free(TheirM);
		return 0;
	}
}

int32_t leerDisco(){

	struct stat datosFichero;
	extern char *map;
	extern int32_t archivo;
	extern int32_t tamanioDisco;
	extern char rutaDisco[50];

	archivo = open(rutaDisco,O_RDWR);

	if(archivo == -1){
		perror("Error de Open()\n");
		return(0);
	}
	else{
		if (stat(rutaDisco, &datosFichero) == -1)
			return 0;

		else{
			tamanioDisco=datosFichero.st_size;
			map = (char*)mmap(NULL, //direccion donde quiero que me haga el mapeo (me da igual por eso pongo NULL)
						tamanioDisco, //tamanio del pedazo del archivo que quiero mapear
						PROT_READ | PROT_WRITE,  //permisos
						MAP_SHARED, //tipo de acceso
						archivo, //el archivo abierto anteriormente
						0); //offset, desde donde queremos empezar a mapear
			if(map)
			madvise(map,tamanioDisco,MADV_SEQUENTIAL);
			return 1;
		}
	}

}

int32_t leerSector(int32_t sectorPedido,char *contenido){

	extern char *map;
	int32_t offset;
	extern int32_t tLectura;
	int32_t tiempo;

	tiempo=tLectura*1000;
	usleep(tiempo);
	offset=sectorPedido*512;
	//pthread_mutex_lock(&mutexMap);
	memcpy(contenido,map+offset,512);
	//pthread_mutex_unlock(&mutexMap);
	return 1;
}

int32_t escribirSector(int32_t sectorPedido,char *cadena){	 //devuelve un 1(int32_t) si la lectura se realizo correctamente, sino un 0(int32_t).

	extern char *map;
	int32_t offset;
	extern char rutaDisco[50];
	extern int32_t tEscritura;
	int32_t tiempo;
	int32_t err;

	tiempo=tEscritura*1000;
	usleep(tiempo);
	offset=sectorPedido*512;
	//pthread_mutex_lock(&mutexMap);
	memcpy(map+offset,cadena,512);
	//pthread_mutex_unlock(&mutexMap);

	if(cantSectoresSincronizados==0){
		//pthread_mutex_lock(&mutexMap);
		err = msync(map, tamanioDisco, MS_ASYNC);
		//pthread_mutex_unlock(&mutexMap);
		flagSincronizacion=0;
		if (err == -1){
			printf("\nError en msync\n");
			log_error(log, "PPD", "Message error: %s", "Error en msync.");
		}
		log_info(log, "PPD", "Message info: %s", "Se terminó de sincronizar el disco");

	}

	return 1;

}

int32_t obtenerSectoresRecorridosSSTF(TNodoPedido *nodoPedido,pistaSector infoCabActual,char *sectores,int32_t *cantPistasAtravesadas, int32_t *cantSectoresAtravesados){
	int32_t inicio,llegada,pista, auxIni, auxFin;

	memset(sectores,'\0',10000);
	extern int32_t cantidadSectoresPorPista;

	*cantPistasAtravesadas=0;
	*cantSectoresAtravesados=0;

	//Si esta en la misma pista...
	if(infoCabActual.pista==nodoPedido->pista){

		if(infoCabActual.sector<nodoPedido->sector){
			inicio=infoCabActual.sector;
			llegada=nodoPedido->sector;
			if(20>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=llegada-9;
				*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,auxFin);
					auxFin++;
				}
			}
		}//ok

		if(infoCabActual.sector>nodoPedido->sector){
			inicio=infoCabActual.sector;
			if(10>cantidadSectoresPorPista-inicio){
				while(inicio<=cantidadSectoresPorPista-1){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=cantidadSectoresPorPista-1;
				*cantSectoresAtravesados=auxFin-infoCabActual.sector+1;
				if(auxIni>cantidadSectoresPorPista-1){
					while(inicio<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
						inicio++;
					}
				}
				else{
					*cantSectoresAtravesados=auxFin-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);

					while(auxFin<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,auxFin);
						auxFin++;
					}
				}

			}
			inicio=0;
			llegada=nodoPedido->sector;
			if(12>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+1;
				auxFin=llegada-9;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,auxFin);
					auxFin++;
				}
			}
		}

		if(infoCabActual.sector==nodoPedido->sector){
			sprintf(sectores,"%d:%d ",nodoPedido->pista,nodoPedido->sector);
		}

	}
	//Si esta en una pista mas grande...
	if(infoCabActual.pista<nodoPedido->pista){
		pista=infoCabActual.pista;
		/*while(pista<nodoPedido->pista){
			pista++;
			(*cantPistasAtravesadas)++;
			sprintf(sectores,"%s %d:%d ",sectores,pista,infoCabActual.sector);
		}*/
		sprintf(sectores,"%s %d:%d - %d:%d ",sectores,pista,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
		*cantPistasAtravesadas=nodoPedido->pista-pista;
		pista=nodoPedido->pista;

		if(infoCabActual.sector<nodoPedido->sector){
			inicio=infoCabActual.sector+1;
			llegada=nodoPedido->sector;
			if(20>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=llegada-9;
				*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
					auxFin++;
				}
			}
		}//ok

		if(infoCabActual.sector>nodoPedido->sector){
			inicio=infoCabActual.sector+1;
			if(10>cantidadSectoresPorPista-inicio){
				while(inicio<=cantidadSectoresPorPista-1){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=cantidadSectoresPorPista-1;
				*cantSectoresAtravesados=auxFin-infoCabActual.sector+1;
				if(auxIni>cantidadSectoresPorPista-1){
					while(inicio<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					*cantSectoresAtravesados=auxFin-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);

					while(auxFin<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}

			}
			inicio=0;
			llegada=nodoPedido->sector;
			if(12>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+1;
				auxFin=llegada-9;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
					auxFin++;
				}
			}
		}
	}

	//Si esta en una pista mas chica...
	if(infoCabActual.pista>nodoPedido->pista){
		pista=infoCabActual.pista;
		/*
		while(pista>nodoPedido->pista){
			pista--;
			(*cantPistasAtravesadas)++;
			sprintf(sectores,"%s %d:%d ",sectores,pista,infoCabActual.sector);
		}
		*/
		sprintf(sectores,"%s %d:%d - %d:%d ",sectores,pista,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
		*cantPistasAtravesadas=pista-nodoPedido->pista;
		pista=nodoPedido->pista;

		if(infoCabActual.sector<nodoPedido->sector){
			inicio=infoCabActual.sector+1;
			llegada=nodoPedido->sector;
			if(20>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=llegada-9;
				*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
					auxFin++;
				}
			}
		}//ok

		if(infoCabActual.sector>nodoPedido->sector){
			inicio=infoCabActual.sector+1;
			if(10>cantidadSectoresPorPista-inicio){
				while(inicio<=cantidadSectoresPorPista-1){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=cantidadSectoresPorPista-1;
				*cantSectoresAtravesados=auxFin-infoCabActual.sector+1;
				if(auxIni>cantidadSectoresPorPista-1){
					while(inicio<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					*cantSectoresAtravesados=auxFin-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);

					while(auxFin<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}

			}
			inicio=0;
			llegada=nodoPedido->sector;
			if(12>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+1;
				auxFin=llegada-9;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
					auxFin++;
				}
			}
		}
	}

	sectores[strlen(sectores)-1]='\0';
	return 1;
}

int32_t obtenerSectoresRecorridosFSCAN(TNodoPedido *nodoPedido,pistaSector infoCabActual,char *sectores,int32_t *cantPistasAtravesadas, int32_t *cantSectoresAtravesados){
	int32_t inicio,llegada,pista,auxIni, auxFin;
	extern char movimientoCabezal;
	extern int32_t cantPistas;
  	extern int32_t cantidadSectoresPorPista;
	memset(sectores,'\0',10000);

	*cantPistasAtravesadas=0;
	*cantSectoresAtravesados=0;

	//Si esta en la misma pista...
	if(infoCabActual.pista==nodoPedido->pista){

		if(infoCabActual.sector<nodoPedido->sector){
			inicio=infoCabActual.sector;
			llegada=nodoPedido->sector;
			if(20>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=llegada-9;
				*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,auxFin);
					auxFin++;
				}
			}
		}//ok

		if(infoCabActual.sector>nodoPedido->sector){
			inicio=infoCabActual.sector;
			if(10>cantidadSectoresPorPista-inicio){
				while(inicio<=cantidadSectoresPorPista-1){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+9;
				auxFin=cantidadSectoresPorPista-1;
				if(auxIni>cantidadSectoresPorPista-1){
					*cantSectoresAtravesados=auxFin-inicio+1;
					while(inicio<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
						inicio++;
					}
				}
				else{
					*cantSectoresAtravesados=auxFin-inicio+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);

					while(auxFin<=cantidadSectoresPorPista-1){
						sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,auxFin);
						auxFin++;
					}
				}

			}
			inicio=0;
			llegada=nodoPedido->sector;
			if(12>llegada-inicio){
				while(inicio<=llegada){
					(*cantSectoresAtravesados)++;
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
			}
			else{
				auxIni=inicio+1;
				auxFin=llegada-9;
				while(inicio<=auxIni){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,inicio);
					inicio++;
				}
				sprintf(sectores,"%s...",sectores);
				*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
				while(auxFin<=llegada){
					sprintf(sectores,"%s %d:%d ",sectores,infoCabActual.pista,auxFin);
					auxFin++;
				}
			}
		}

		if(infoCabActual.sector==nodoPedido->sector){
			sprintf(sectores,"%d:%d ",nodoPedido->pista,nodoPedido->sector);
		}



	}
	//Si esta en una pista mas grande...
	if(infoCabActual.pista<nodoPedido->pista){
		if(movimientoCabezal=='A'){
			pista=infoCabActual.pista;
		/*	while(pista<nodoPedido->pista){
				pista++;
				(*cantPistasAtravesadas)++;
				sprintf(sectores,"%s %d:%d ",sectores,pista,infoCabActual.sector);
			}
		*/
			sprintf(sectores,"%s %d:%d - %d:%d ",sectores,pista,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
			*cantPistasAtravesadas=nodoPedido->pista-pista;
			pista=nodoPedido->pista;

			if(infoCabActual.sector<nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				llegada=nodoPedido->sector;
				if(20>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=llegada-9;
					*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}//ok

			if(infoCabActual.sector>nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				if(10>cantidadSectoresPorPista-inicio){
					while(inicio<=cantidadSectoresPorPista-1){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=cantidadSectoresPorPista-1;
					if(auxIni>cantidadSectoresPorPista-1){
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
					}
					else{
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=auxIni){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
						sprintf(sectores,"%s...",sectores);
						while(auxFin<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
							auxFin++;
						}
					}

				}
				inicio=0;
				llegada=nodoPedido->sector;
				if(12>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+1;
					auxFin=llegada-9;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}
		}
		else{
			if(infoCabActual.pista==0){
				sprintf(sectores,"%d:%d - %d:%d ",infoCabActual.pista,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
				*cantPistasAtravesadas=(infoCabActual.pista)+nodoPedido->pista;
			}
			else{
				sprintf(sectores,"%d:%d - 0:%d , 0:%d - %d:%d ",infoCabActual.pista,infoCabActual.sector,infoCabActual.sector,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
				*cantPistasAtravesadas=(infoCabActual.pista)+nodoPedido->pista;
			}
			pista=nodoPedido->pista;
			if(infoCabActual.sector<nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				llegada=nodoPedido->sector;
				if(20>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=llegada-9;
					*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}//ok

			if(infoCabActual.sector>nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				if(10>cantidadSectoresPorPista-inicio){
					while(inicio<=cantidadSectoresPorPista-1){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=cantidadSectoresPorPista-1;
					if(auxIni>cantidadSectoresPorPista-1){
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
					}
					else{
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=auxIni){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
						sprintf(sectores,"%s...",sectores);

						while(auxFin<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
							auxFin++;
						}
					}

				}
				inicio=0;
				llegada=nodoPedido->sector;
				if(12>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+1;
					auxFin=llegada-9;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}
		}
	}

	//Si esta en una pista mas chica...
	if(infoCabActual.pista>nodoPedido->pista){

		if(movimientoCabezal=='D'){

			pista=infoCabActual.pista;
			/*
			 	while(pista>nodoPedido->pista){
				pista--;
				(*cantPistasAtravesadas)++;
				sprintf(sectores,"%s %d:%d ",sectores,pista,infoCabActual.sector);
			}
			*/
			sprintf(sectores,"%s %d:%d - %d:%d ",sectores,pista,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
			*cantPistasAtravesadas=pista-nodoPedido->pista;
			pista=nodoPedido->pista;

			if(infoCabActual.sector<nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				llegada=nodoPedido->sector;
				if(20>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=llegada-9;
					*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}//ok

			if(infoCabActual.sector>nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				if(10>cantidadSectoresPorPista-inicio){
					while(inicio<=cantidadSectoresPorPista-1){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=cantidadSectoresPorPista-1;
					if(auxIni>cantidadSectoresPorPista-1){
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
					}
					else{
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=auxIni){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
						sprintf(sectores,"%s...",sectores);

						while(auxFin<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
							auxFin++;
						}
					}

				}
				inicio=0;
				llegada=nodoPedido->sector;
				if(12>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+1;
					auxFin=llegada-9;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}
		}
		else{
			if(infoCabActual.pista==cantPistas-1){
				sprintf(sectores,"%d:%d - %d:%d ",infoCabActual.pista,infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
				*cantPistasAtravesadas=((cantPistas-1)-(infoCabActual.pista))+((cantPistas-1)-nodoPedido->pista);
			}
			else{
				sprintf(sectores,"%d:%d - %d:%d , %d:%d - %d:%d ",infoCabActual.pista,infoCabActual.sector,(cantPistas-1),infoCabActual.sector,(cantPistas-1),infoCabActual.sector,nodoPedido->pista,infoCabActual.sector);
				*cantPistasAtravesadas=((cantPistas-1)-(infoCabActual.pista))+((cantPistas-1)-nodoPedido->pista);
			}
			if(infoCabActual.sector<nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				llegada=nodoPedido->sector;
				if(20>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=llegada-9;
					*cantSectoresAtravesados=llegada-infoCabActual.sector+1;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}//ok

			if(infoCabActual.sector>nodoPedido->sector){
				inicio=infoCabActual.sector+1;
				if(10>cantidadSectoresPorPista-inicio){
					while(inicio<=cantidadSectoresPorPista-1){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+9;
					auxFin=cantidadSectoresPorPista-1;
					if(auxIni>cantidadSectoresPorPista-1){
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
					}
					else{
						*cantSectoresAtravesados=auxFin-inicio+1;
						while(inicio<=auxIni){
							sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
							inicio++;
						}
						sprintf(sectores,"%s...",sectores);
						while(auxFin<=cantidadSectoresPorPista-1){
							sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
							auxFin++;
						}
					}

				}
				inicio=0;
				llegada=nodoPedido->sector;
				if(12>llegada-inicio){
					while(inicio<=llegada){
						(*cantSectoresAtravesados)++;
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
				}
				else{
					auxIni=inicio+1;
					auxFin=llegada-9;
					while(inicio<=auxIni){
						sprintf(sectores,"%s %d:%d ",sectores,pista,inicio);
						inicio++;
					}
					sprintf(sectores,"%s...",sectores);
					*cantSectoresAtravesados=*cantSectoresAtravesados+llegada;
					while(auxFin<=llegada){
						sprintf(sectores,"%s %d:%d ",sectores,pista,auxFin);
						auxFin++;
					}
				}
			}
		}
	}
	sectores[strlen(sectores)-1]='\0';
	return 1;
}

/******* Archivo de Configuracion *******/
int32_t obtenerCadena (char *archivo, char *readBuffer, int32_t linea){

	FILE *f1;
	int32_t i=1;

	f1 = fopen(archivo,"rb");
	if(f1==NULL){
		printf("\nNo se puede abrir el archivo de Configuracion de Disco\n");
		return -1;
	}
	else{
		while(i<=linea){
			fgets(readBuffer,100,f1);
			i++;
		}
		fclose(f1);
		return 0;
	}
}

char* obtenerModoInicio (void){

	char *modo;
	char readBuffer[100];
	int32_t j=0,i=0;

	if(obtenerCadena(rutaArchivoConfig,readBuffer,1)!=-1){

		
		modo=(char *) calloc (1, sizeof(char)*20);

		while(readBuffer[j]!=':')
			j++;
		j++;
		while((readBuffer[j]!='\n')&&(readBuffer[j]!='\r')){
			modo[i]=readBuffer[j];
			j++;
			i++;
		}
		modo[i]='\0';

		return modo;
	}
	else
		return("Error");
}

int32_t *obtenerIpRaid (void){

	int32_t *val=(int32_t *)calloc(1,sizeof(int32_t)*4);
	int32_t j=0, a=0, num=0,pos=0,n=0;
	char IP[30],letra,ReadBuffer[100];

	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,2)!=-1){


		while(ReadBuffer[pos]!=':')
			pos++;
		pos++;
		while((ReadBuffer[pos]!='\n')&&(ReadBuffer[pos]!='\r')){
			IP[n]=ReadBuffer[pos];
			pos++;
			n++;
		}
		IP[n]='\0';

		while(a!=4){
			letra = IP[j];
			if ((IP[j]!= '\0') && (IP[j]!= '.')) {
				if (num == 0)
					num = letra - 48;
				else {
					num = ((num * 10) + (letra - 48));
				}
			}
			if ((IP[j]== '\0') || (IP[j]== '.')) {

			   val[a]=num ;
				num = 0;
				a++;}
			   j++;
		}

		return val;
	}
		return NULL;

}

int32_t obtenerPuertoRaid(){


	int32_t pos=0,num=0,j=0;
	char PORT[8];
	char ReadBuffer[100];

	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,3)!=-1){

		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			PORT[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		PORT[pos]='\0';

		num=atoi(PORT);
		return num;
	}
	else
		return -1;

}

void obtenerAlgoritmo (void){

	extern char algoritmo[10];
	char readBuffer[100];
	int32_t j=0,i=0;

	if(obtenerCadena(rutaArchivoConfig,readBuffer,4)!=-1){

		while(readBuffer[j]!=':')
			j++;
		j++;
		while((readBuffer[j]!='\n')&&(readBuffer[j]!='\r')){
			algoritmo[i]=readBuffer[j];

			j++;
			i++;
		}
		algoritmo[i]='\0';

}
}

char *obtenerPuertoConsola(){

	int32_t pos=0,j=0;
	extern char PORT[50];
	char ReadBuffer[100];

	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,5)!=-1){
	
		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			PORT[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		PORT[pos]='\0';
		return PORT;
	}
	else
		return("Error");
}

int32_t obtenerFlagLog(){


	int32_t pos=0,flag=0,j=0;
	char f[2];
	char ReadBuffer[100];

	
	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,6)!=-1){
		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			f[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		f[pos]='\0';
		flag=atoi(f);
		return flag;
	}
	else
		return -1;

}

char* obtenerNombreDisco (void){
	char *nombDisco;
	char readBuffer[100];
	int32_t j=0,i=0;

	if(obtenerCadena(rutaArchivoConfig,readBuffer,7)!=-1){

		nombDisco=(char *) calloc (1, sizeof(char)*30);

		while(readBuffer[j]!=':')
			j++;
		j++;
		while((readBuffer[j]!='\n')&&(readBuffer[j]!='\r')){
			nombDisco[i]=readBuffer[j];
			j++;
			i++;
		}
		nombDisco[i]='\0';

		return nombDisco;
	}
	else
		return("Error");
}

int32_t *obtenerCHS(){
	 int32_t *val =(int32_t *)calloc(1, (sizeof(int32_t)*3));
   	int32_t j=0, a=0,pos=0,n=0,i=0;
	char nro[6];
	char readBuffer[100];
	char CHS[30];

	if(obtenerCadena(rutaArchivoConfig,readBuffer,8)!=-1){

		while(readBuffer[pos]!=':')
			pos++;
		pos++;

		while((readBuffer[pos]!='\n')&&(readBuffer[pos]!='\r')){
			CHS[n]=readBuffer[pos];
			pos++;
			n++;
		}
		CHS[n]='\0';

		while(a<3){
			i=0;
			while ((CHS[j]!= '\0') && (CHS[j]!= '.')) {
				nro[i]=CHS[j];
				i++;
				j++;
			}
			nro[i]='\0';
			val[a]=atoi(nro);
			a++;
			j++;
		}

		return val;
	}
	else
		return NULL;
		
}

int32_t obtenerTiempoLectura(){

   	int32_t pos=0,n=0, tEnMiliSeg;
	//float valor;
	char   readBuffer[100];
	char tiempoLectura[10];


	if(obtenerCadena(rutaArchivoConfig,readBuffer,9)!=-1){


		while(readBuffer[pos]!=':')
			pos++;
		pos++;

		while((readBuffer[pos]!='\n')&&(readBuffer[pos]!='\r')){
			tiempoLectura[n]=readBuffer[pos];
			pos++;
			n++;
		}
		tiempoLectura[n]='\0';
		tEnMiliSeg=(int32_t)atoi(tiempoLectura);
		//valor = (float) atof((const char*)tiempoLectura);

		return tEnMiliSeg;
	}
	else
		return -1;
}

int32_t obtenerTiempoEscritura(){

   	int32_t pos=0,n=0,tEnMiliSeg;
	//float valor;
	char   readBuffer[100];
	char tiempoEscritura[10];

	if(obtenerCadena(rutaArchivoConfig,readBuffer,10)!=-1){

		while(readBuffer[pos]!=':')
			pos++;
		pos++;

		while((readBuffer[pos]!='\n')&&(readBuffer[pos]!='\r')){
			tiempoEscritura[n]=readBuffer[pos];
			pos++;
			n++;
		}
		tiempoEscritura[n]='\0';
		tEnMiliSeg=atoi(tiempoEscritura);
		//valor = (float) atof((const char*)tiempoEscritura);

		return tEnMiliSeg;
	}
	else
		return -1;
}

int32_t obtenerRPM(){

	int32_t pos=0,num=0,j=0;
	char RPM[8];
	char ReadBuffer[100];


	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,11)!=-1){

		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			RPM[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		RPM[pos]='\0';
		num=atoi(RPM);

		return num;
	}
	else
		return -1;
}

int32_t obtenerTiempoEntrePistas(){

   	int32_t pos=0,n=0,tEnMiliSeg;
	//float valor;
	char   readBuffer[100];
	char tiempoPista[10];

	if(obtenerCadena(rutaArchivoConfig,readBuffer,12)!=-1){

		while(readBuffer[pos]!=':')
			pos++;
		pos++;

		while((readBuffer[pos]!='\n')&&(readBuffer[pos]!='\r')){
			tiempoPista[n]=readBuffer[pos];
			pos++;
			n++;
		}
		tiempoPista[n]='\0';
		tEnMiliSeg=atoi(tiempoPista);
		//valor = (float) atof((const char*)tiempoPista);

		return tEnMiliSeg;
	}
	else
		return -1;
}

int32_t obtenerPistaActual(){
    int32_t val;
   	int32_t pos=0,n=0;
	char readBuffer[100];
	char pista[30];

	if(obtenerCadena(rutaArchivoConfig,readBuffer,13)!=-1){

		while(readBuffer[pos]!=':')
			pos++;
		pos++;

		while(readBuffer[pos]!='.'){
			pista[n]=readBuffer[pos];
			pos++;
			n++;
		}
		pista[n]='\0';
		val=atoi(pista);

		return val;
	}
	else
		return -1;
}

int32_t obtenerSectorActual(){
	int32_t val;
   	int32_t pos=0,n=0;
	char readBuffer[100];
	char sector[30];

	if(obtenerCadena(rutaArchivoConfig,readBuffer,13)!=-1){

		while(readBuffer[pos]!=':')
			pos++;
		pos++;
		while(readBuffer[pos]!='.')
			pos++;
		pos++;

		while((readBuffer[pos]!='\n')&&(readBuffer[pos]!='\r')){
			sector[n]=readBuffer[pos];
			pos++;
			n++;
		}
		sector[n]='\0';
		val=atol(sector);

		return val;
	}
	else
		return -1;
}

char obtenerMovimientoCabezal (void){

	char movi;
	char readBuffer[100];
	int32_t j=0;


	obtenerCadena(rutaArchivoConfig,readBuffer,14);

	while(readBuffer[j]!=':')
		j++;
	j++;
	while((readBuffer[j]!='\n')&&(readBuffer[j]!='\r')){
		movi=readBuffer[j];
		j++;
	}
	return movi;
}

int32_t *obtenerIpPpd(void){

	int32_t *val=(int32_t*)calloc(1,sizeof(int32_t)*4);
	int32_t j=0, a=0, num=0,pos=0,n=0;
	char IP[30],letra,ReadBuffer[100];


	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,15)!=-1){

		while(ReadBuffer[pos]!=':')
			pos++;
		pos++;
		while((ReadBuffer[pos]!='\n')&&(ReadBuffer[pos]!='\r')){
			IP[n]=ReadBuffer[pos];
			pos++;
			n++;
		}
		IP[n]='\0';

		while(a!=4){
			letra = IP[j];
			if ((IP[j]!= '\0') && (IP[j]!= '.')) {
				if (num == 0)
					num = letra - 48;
				else {
					num = ((num * 10) + (letra - 48));
				}
			}
			if ((IP[j]== '\0') || (IP[j]== '.')) {

			   val[a]=num ;
				num = 0;
				a++;}
			   j++;
		}

		return val;
	}
		return NULL;

}

int32_t obtenerPuertoTcp(){

	int32_t pos=0,j=0;
	char PORT_C[50];
	int32_t port;
	char ReadBuffer[100];
	memset(PORT_C,'\0',50);

	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,16)!=-1){

		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			PORT_C[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		PORT_C[pos]='\0';
		port=atoi(PORT_C);
		return port;
	}
	else
		return -1;

}

int32_t rutaDelDisco(){

	int32_t pos=0,j=0;
	extern char rutaDisco[50];
	char ReadBuffer[100];
	memset(rutaDisco,'\0',50);

	if(obtenerCadena(rutaArchivoConfig,ReadBuffer,17)!=-1){

		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			rutaDisco[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		rutaDisco[pos]='\0';
		return 1;
	}
	else
		return 0;

}

int32_t funRutaEjecutableDisco(){

	int32_t pos=0,j=0;
	extern char rutaEjecutableDisco[50];
	char ReadBuffer[100];
	memset(rutaEjecutableDisco,'\0',50);

		if(obtenerCadena(rutaArchivoConfig,ReadBuffer,18)!=-1){

		while(ReadBuffer[j]!=':')
			j++;

		j++;
		while((ReadBuffer[j]!='\n')&&(ReadBuffer[j]!='\r')){
			rutaEjecutableDisco[pos]=ReadBuffer[j];
			j++;
			pos++;
		}
		rutaEjecutableDisco[pos]='\0';
		return 1;
	}
	else
		return 0;

}

/******* Funciones para el LOG *******/
/*
void armarInfoPedidoLog(char pedidos[400], TNodoPedido *nodoPedido, pistaSector proxSectorTRACE){
	char sectores[300];
	int32_t cantPistasAtravesadas;
	int32_t cantSectoresAtravesados;
	extern float tEntreSectores, tEntrePistas;
	float tTotalPistas, tTotalSectores;
	extern pistaSector infoCabActual;
	extern char algoritmo[10];
	//char *datos;
	char datos[800];
	extern t_log* log;
	
	//datos=(char*)calloc(1,sizeof(char)*100);
	memset(datos,'\0',sizeof(datos));
	
	sprintf(datos,"\n%sPosicion actual:  %d:%d \n",pedidos,infoCabActual.pista,infoCabActual.sector);

	if(!strcmp(algoritmo,"SSTF"))
		obtenerSectoresRecorridosSSTF(nodoPedido,infoCabActual,sectores,&cantPistasAtravesadas, &cantSectoresAtravesados);
	if(!strcmp(algoritmo,"FSCAN"))
		obtenerSectoresRecorridosFSCAN(nodoPedido,infoCabActual,sectores,&cantPistasAtravesadas, &cantSectoresAtravesados);

	tTotalPistas=cantPistasAtravesadas*tEntrePistas;
	tTotalSectores=cantSectoresAtravesados*tEntreSectores;

	sprintf(datos,"%sSector solicitado:  %d:%d\n",datos,nodoPedido->pista,nodoPedido->sector);
	sprintf(datos,"%sSectores recorridos:  %s\n",datos,sectores);
	sprintf(datos,"%sTiempo consumido:  %f ms\n",datos,tTotalSectores+tTotalPistas);
	if(proxSectorTRACE.pista==-1)
		sprintf(datos,"%sProximo sector:  ...\n",datos);
	else
		sprintf(datos,"%sProximo sector:  %d:%d",datos,proxSectorTRACE.pista,proxSectorTRACE.sector);
	
	log_info(log, "PPD", "Message info: %s", datos);

	//free(datos);
}

*/
